// 函数的返回值;
function func(params: string) {
  return params + "nice";
}

func("111");
console.log(func("222"));

// 函数类型声明写法
const az_name2: string = "azyyz";
// 函数返回值类型定义;
const foo = function (params: string) {
  console.log(params);
  return params + az_name2;
};
// type 定义 FuncFoo 类型声明 传入值 name:string 返回值 类型 number
type FuncFoo = (name: "") => number;

// 描述 函数的类型结构, 可以使用 interface
interface FuncFooStruct {
  (name: string): number;
}
const func3 = () => {};

// void 函数类型  无返回值
function foo1(): void {}
// void return
function foo2(): void {}

// 更好的方式使用 undefined
function foo3(): undefined {}

// 可选参数 与 rest 参数
// age? (可选参数) number 返回类型
function fooOne(name: string, age?: number): number {
  const inputAge = age ?? 18;
  return name.length + inputAge;
}
// rest 参数; any[多个参数];
function fooTwo(arg1: string, ...rest: any[]) {}
// rest 相当于可拓展 参数(类型)
function fooThree(arg1: string, ...rest: [number, boolean]) {}

// 异步函数 genertor 函数等类型签名;
async function asyncFunc(): Promise<void> {}

function* genFunc(): Iterable<void> {}

async function* asyncGenFunc(params: ""): AsyncIterable<void> {}
// class 类与类成员 的类型签名
class Foo {
  prop: string;

  constructor(inputProp: string) {
    this.prop = inputProp;
  }
  print(addon: string): void {
    console.log(`${this.prop} and ${addon}`);
  }
  get propA(): string {
    return `${this.prop} +A`;
  }
  set propA(value: string) {
    this.prop = `${value}+A`;
  }
}
// TS 成员 有一些修饰符 public / private / protected / readonly
// class Foo1 {
//   private prop: string;
//   constructor(public arg1:string)
// }


